import { isFromWeiXin } from "./utils.js";
import wxShareUrl from "fastman3-dfyjapp-configcenter/es/wxshare/prod.js";
import { request } from "@tarojs/taro-h5/dist/api/network/request";

import wxIns, { menuShare } from "weixin-js-sdk";


// import "./jweixin-1.6.0.js";
// const wxIns = window.jWeixin;


class wxJsSdk {
  // 锁住状态，防止短时间内连续调用两次
  // static lockStatus = false;
  static lockStatus: boolean;
  // 设置队列，用于处理短时间多次设置，当微信getticket未初始化完成时，将其他设置放到队列中，等到初始化完成之后处理
  // static setQueue: any = [];
  static setQueue: any[];

  private wxConfig: any;
  // private params:any
  private reqUrl: any;
  private debug: any;
  private reqParam: any;
  private accountNumber: any;

  constructor(_params: any = {}) {
    this.wxConfig = null;
    this.reqUrl = _params.reqUrl;
    this.accountNumber = _params.accountNumber;
    this.debug = _params.debug;

    console.log("【fastman-wxJsSdk】初始化成功");
  }

  _configWx(_param, _callback) {
    let self = this;
    self.reqParam =
      "channelNo=1&password=tty_2015&shareUrl=" +
      encodeURIComponent(window.location.href) +
      "&accountNumber=" +
      self.accountNumber;
    wxIns.error(function (res) {
      // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
      console.error("【fastman-wxJsSdk】wx jssdk调用异常", res);
    });
    console.log("【fastman-wxJsSdk】/getTicket req -> ", self.reqParam);
    if (wxJsSdk.lockStatus) {
      return;
    }
    // 锁住
    wxJsSdk.lockStatus = true;
    request({
      url: self.reqUrl,
      // async:true,
      dataType: "json",
      method: "POST",
      data: self.reqParam,
      header: {
        "Content-Type": "application/x-www-form-urlencoded", // 默认值
      },
    })
      // fetch(self.reqUrl, {
      //   method: "POST",
      //   headers: {
      //     "Content-Type": "application/x-www-form-urlencoded",
      //   },
      //   body: new URLSearchParams(self.reqParam).toString()
      // })
      .then(function (res: any) {
        self.wxConfig = res.data;
        console.log("【fastman-wxJsSdk】/getTicket resp <- ", self.wxConfig);
        console.log({
          debug: self.debug ? true : false,
          appId: self.wxConfig.appId,
          timestamp: self.wxConfig.timestamp,
          nonceStr: self.wxConfig.nonceStr,
          signature: self.wxConfig.signature,
        });
        if (wxIns) {
          wxIns.config({
            debug: self.debug ? true : false,
            appId: self.wxConfig.appId,
            timestamp: self.wxConfig.timestamp,
            nonceStr: self.wxConfig.nonceStr,
            signature: self.wxConfig.signature,
            openTagList: ["wx-open-launch-app"],
            jsApiList: [
              "chooseImage",
              "previewImage",
              "updateAppMessageShareData",
              "updateTimelineShareData",
              "onMenuShareWeibo",
              "onMenuShareQZone",
              "hideMenuItems",
              "showMenuItems",
              "hideAllNonBaseMenuItem",
              "showAllNonBaseMenuItem",
            ],
          });
        }
        if (_callback) {
          wxIns.ready(function () {
            // 检测是否支持唤醒 App
            wxIns.invoke('checkLaunchApp', {}, function(res) {
              if (res.errMsg === 'checkLaunchApp:ok') {
                if (res.support) {
                  console.log("当前环境支持唤醒 App");
                  // 显示唤醒按钮或直接触发唤醒
                } else {
                  console.log("当前环境不支持唤醒 App");
                  // 显示引导下载或升级提示
                }
              } else {
                console.error("检测失败：", res.errMsg);
              }
            });

            // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
            _callback(_param);
          });
        }
        // 假如设置队列里有数据，则将剩余设置继续处理
        for (let i = 0; i < wxJsSdk.setQueue.length; i++) {
          let fun = wxJsSdk.setQueue[i];
          console.log(
            "【fastman-wxJsSdk】设置队列 执行:" + JSON.stringify(fun.param),
          );
          fun.callback(fun.param);
        }
        // 清空设置队列
        wxJsSdk.setQueue = [];
      })
      .catch((err) => {
        // 失败则重新开启
        wxJsSdk.lockStatus = false;
        console.error(
          "【fastman-wxJsSdk】/RoxApiWeb/wxauth/getTicket调用异常",
          err,
        );
      });
  }

  _baseHandle(_param, _fun) {
    if (isFromWeiXin() && !this.debug) return;
    // 状态锁住并且微信配置没有完认证时(表示短时间内多次设置，但是微信配置还未初始化完成)，将调用的设置放到设置队列中
    if (wxJsSdk.lockStatus && !this.wxConfig) {
      console.log("【fastman-wxJsSdk】短时间内多次设置");
      let fun = {
        callback: _fun,
        param: _param,
      };
      wxJsSdk.setQueue.push(fun);
      console.log("【fastman-wxJsSdk】设置参数" + JSON.stringify(_param));
    }
    // 微信配置完整认证，则直接去设置
    else if (this.wxConfig) {
      _fun(_param);
    } else {
      // 微信上未完成认证时，先认证后执行
      this._configWx(_param, _fun);
    }
  }

  _wxShareInfo(_param) {
    wxIns.ready(function () {
      // 获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
      wxIns.onMenuShareWeibo(_param);
      // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容（1.4.0）
      wxIns.updateAppMessageShareData(_param);

      // 分析到qq空间
      wxIns.onMenuShareQZone(_param);
      // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容（1.4.0）
      // 这里是异步操作，不要直接修改info对象，重新复制一个
      var infoTimeline = {
        imgUrl: _param.imgUrl,
        link: _param.link,
        title: _param.title,
        success: _param.success,
        cancel: _param.cancel,
      };
      wxIns.updateTimelineShareData(infoTimeline);
    });
  }

  _switchShareMenu(_status) {
    wxIns.ready(function () {
      let menuItems = {
        menuList: [
          "menuItem:share:appMessage",
          "menuItem:share:timeline",
          "menuItem:share:qq",
          "menuItem:share:weiboApp",
          "menuItem:share:facebook",
          "menuItem:share:QZone",
        ],
      };
      if (_status) {
        wxIns.showMenuItems(menuItems);
      } else {
        wxIns.hideMenuItems(menuItems);
      }
    });
  }

  _switchNonBaseMenu(_status) {
    wxIns.ready(function () {
      if (_status) {
        wxIns.showAllNonBaseMenuItem();
      } else {
        wxIns.hideAllNonBaseMenuItem();
      }
    });
  }

  /**
   * 设置微信分享参数
   * @param {object} _param
   * {
   title: '', // 分享标题
   desc: '', // 分享描述
   link: '', // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
   imgUrl: '', // 分享图标
   type: '', // (分享给朋友时使用)分享类型,music、video或link，不填默认为link
   dataUrl: '', // (分享给朋友时使用)如果type是music或video，则要提供数据链接，默认为空
   success: function () {
   // 用户确认分享后执行的回调函数
   },
   cancel: function () {
   // 用户取消分享后执行的回调函数
   }
   * }
   */
  setWxShareInfo(_param) {
    this._baseHandle(_param, this._wxShareInfo);
  }

  /**
   * 是否显示分享菜单
   * @param  {[bool]} _status [
   * true 显示
   * false 隐藏
   * ]
   */
  switchShareMenu(_status) {
    this._baseHandle(_status, this._switchShareMenu);
  }

  /**
   * 是否显示刷新菜单
   * @param  {[bool]} _status [
   * true 显示
   * false 隐藏
   * ]
   */
  switchNonBaseMenu(_status) {
    this._baseHandle(_status, this._switchNonBaseMenu);
  }

  /**
   * debug模式开关,默认是关闭
   * @param  {[bool]} _status [
   * true 开启
   * false 关闭
   * ]
   */
  debugSwitch(_status) {
    this.debug = _status;
  }

  /**
   * 进行授权操作
   * @param {object} _initParam
   * {
   accountNumber: '', // 公众号账号
   reqUrl: '', // 请求授权url
   * }
   */
  configWx(_initParam: any) {
    if (_initParam.accountNumber) {
      this.accountNumber = _initParam.accountNumber;
    }
    if (_initParam.reqUrl) {
      this.reqUrl = _initParam.reqUrl;
    }
    this._configWx({}, _initParam.callback);
  }
}
// @ts-ignore
wxJsSdk.lockStatus = false;
wxJsSdk.setQueue = [];

let instance;
const getInstance = (_param: any) => {
  if (!instance) {
    instance = new wxJsSdk(_param);
  }
  return instance;
};

let wxInstance = getInstance({
  debug: true,
  reqUrl:
    wxShareUrl.WX_SHARE_DOMAIN.replace(/\"/g, "") +
    "RoxApiWeb/wxauth/getTicket",
  accountNumber: wxShareUrl.WX_SHARE_ACCOUNT.replace(/\"/g, ""),
});
export { wxInstance };
